package org.znxs.znagent_s.rag.tools.webSearch;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.beans.factory.annotation.Value;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 智谱AI Web Search工具
 * 提供基于智谱AI的网络搜索功能
 */
@Slf4j
public class ZhipuWebSearchTool {


    private final String zhipuApiKey;


    private static final String SEARCH_API_URL = "https://open.bigmodel.cn/api/paas/v4/web_search";

    public ZhipuWebSearchTool(String zhipuApiKey) {
        this.zhipuApiKey = zhipuApiKey;
    }


    /**
     * 执行网络搜索  TODO 这个网页搜索的内容非常有限，经常会出现搜索失败的情况
     *
     * @param searchQuery 搜索内容
     * @return 搜索结果
     */
    @Tool(description = "使用智谱AI提供的Web Search功能进行网络搜索，获取最新的互联网信息,如果出现搜索失败，可以尝试多次调用该工具(获取调用其他搜索工具)")
    public String zhipuSearch(
            @ToolParam(description = "搜索内容，建议不超过78个字符")
            String searchQuery) {
        log.info("调用api 搜索关键词：{}", searchQuery);
        try {
            // 1. 构建请求参数 Map
            Map<String, String> paramMap = new HashMap<>();
            paramMap.put("search_engine", "search_pro");
            paramMap.put("search_query", searchQuery);

            // 2. 发送 POST 请求（注意：不是 get，而是 post）
            String requestBodyJson = JSONUtil.toJsonStr(paramMap);

            HttpResponse response = HttpRequest.post(SEARCH_API_URL)
                    .header("Authorization", "Bearer " + zhipuApiKey)  // 注意中间有个空格
                    .header("Content-Type", "application/json")
                    .body(requestBodyJson)
                    .execute();
            // 3. 获取响应状态码和内容
            int status = response.getStatus();
            String body = response.body();

//            System.out.println("HTTP 状态码: " + status);
//            System.out.println("响应内容: " + body);

            // 4. 解析 JSON 响应
            if (status == 200 && ObjectUtil.isNotEmpty(body)) {
                JSONObject jsonResponse = JSONUtil.parseObj(body);

                // 搜索意图
                List<JSONObject> intentList = jsonResponse.getJSONArray("search_intent").toList(JSONObject.class);
//                for (JSONObject intent : intentList) {
//                    System.out.println("搜索意图: " + intent.getStr("intent"));
//                    System.out.println("关键词: " + intent.getStr("keywords"));
//                }

                // 搜索结果
                List<JSONObject> results = jsonResponse.getJSONArray("search_result").toList(JSONObject.class);
                int index = 1;
                StringBuilder resStr = new StringBuilder();
                for (JSONObject result : results) {
                    resStr.append(index++).append(". 标题：").append(result.getStr("title"));
                    resStr.append("   内容：").append(result.getStr("content"));
                    resStr.append("   链接：").append(result.getStr("link"));
                    resStr.append("   来源：").append(result.getStr("refer"));
                }
                return resStr.toString();
            } else {
                System.err.println("请求失败或无返回内容");
                return "请求失败或无返回内容";
            }
        } catch (
                Exception e) {
            e.printStackTrace();
            throw new RuntimeException("智谱AI 调用搜索请求出现错误");
        }
    }
}
